home *** CD-ROM | disk | FTP | other *** search
- 10 REM ****************************
- 20 REM ** BASIC EDITOR VER1.0 **
- 30 REM ** BY P.F.HAYES (C) 1988 **
- 40 REM ****************************
- 50 PRINT"[147]INITIALISING PROGRAM":GOSUB 2900:CLR:GOSUB 1720
- 60 GOSUB 1770
- 70 PRINT"[147][158]**************BASIC EDITOR**************[154]"
- 80 PRINT" 1) EXIT FROM EDITOR"
- 90 PRINT" 2) RE-INITIALISE PROGRAM"
- 100 PRINT" 3) LOAD FILE"
- 110 PRINT" 4) INPUT LINE(S)"
- 120 PRINT" 5) LIST LINE(S)"
- 130 PRINT" 6) DELETE LINE(S)"
- 140 PRINT" 7) EDIT FILE"
- 150 PRINT" 8) MERGE/APPEND FILE"
- 160 PRINT" 9) SAVE FILE LINE(S)"
- 170 PRINT" 10) CHANGE DEVICE NUMBER"
- 180 PRINT" 11) SEARCH FOR STRING"
- 190 PRINT" 12) DIRECTORY"
- 200 INPUT"COMMAND (1-12) = ";CM
- 210 IF CM=1 THEN GOTO 2820
- 220 IF CM=2 OR CM=3 THEN INPUT"ERASES CURRENT FILE:CONTINUE (Y/N) N[157][157][157]";T$
- 230 IF CM=2 AND T$="Y" THEN CLR:GOSUB 1720:GOSUB 1770
- 240 IF CM=3 AND T$="Y" THEN CLR:CM=3:GOSUB 1720:GOSUB 1770:GOSUB 1360
- 250 IF CM>3 THEN ON CM-3 GOSUB 280,830,1130,1850,1280,1480,1680,2510,2680
- 260 GOTO 70
- 270 REM ***INPUT BASIC LINE(S)***
- 280 INPUT"AUTO LINE NUMBERING (Y/N) N[157][157][157]";T$
- 290 IF T$="Y" THEN 400
- 300 PRINT"[147]":OPEN 2,0
- 310 INPUT@2,IP$:IF IP$=CHR$(95) THEN 370
- 320 IF LEN(IP$)>80 THEN IP$=LEFT$(IP$,80)
- 330 GOSUB 500:IF LN=-1 THEN 370
- 340 IF LN<1 OR LN>65534 THEN PRINT"INVALID LINE NUMBER:RE-ENTER":GOTO 310
- 350 GOSUB 550:IF LEN(IP$)=0 THEN 380
- 360 GOSUB 580:IF NOT ERR THEN PRINT:GOTO 310
- 370 CLOSE 2:RETURN
- 380 GOSUB 750:IF NOT ERR THEN GOSUB 1190
- 390 PRINT:GOTO 310
- 400 INPUT"START LINE NUMBER = ";BL:INPUT"LINE NUMBER INCREMENT = ";IL
- 410 PRINT"[147]":OPEN 2,0:SI=0
- 420 AL$=MID$(STR$(BL+SI),2):PRINTAL$;" ";:INPUT@2,IP$:IF IP$=CHR$(95) THEN 480
- 430 IP$=AL$+IP$:IF LEN(IP$)>80 THEN IP$=LEFT$(IP$,80)
- 440 GOSUB 500:IF LN=-1 THEN 480
- 450 IF LN<1 OR LN>65534 THEN PRINT"INVALID LINE NUMBER:RE-ENTER":GOTO 420
- 460 GOSUB 550:IF LEN(IP$)=0 THEN PRINT:GOTO 420
- 470 GOSUB 580:IF NOT ERR THEN SI=SI+IL:PRINT:GOTO 420
- 480 CLOSE 2:RETURN
- 490 REM ***EXTRACT LINE NUMBER***
- 500 LN=-1:IF LEN(IP$)=0 OR IP$<"0" OR LEFT$(IP$,1)>"9" THEN 530
- 510 FOR T=1 TO LEN(IP$):IF MID$(IP$,T,1)<="9" AND MID$(IP$,T,1)>="0" THEN NEXT T
- 520 LN=VAL(LEFT$(IP$,T-1)):IP$=MID$(IP$,T)
- 530 RETURN
- 540 REM ***EXTRACT LINE TEXT***
- 550 FOR T=1 TO LEN(IP$):IF MID$(IP$,T,1)=" " THEN NEXT T
- 560 IP$=MID$(IP$,T):RETURN
- 570 REM ***INSERT LINE IN FILE ARRAY***
- 580 IF LN<1 OR LN>65534 THEN 720
- 590 GOSUB 750
- 600 TT=IM
- 610 IF NOT ERR THEN TT=MA:GOTO 660
- 620 IF LEN(EM$)=0 THEN 640
- 630 TT=FNE1(TT):EM$=MID$(EM$,3):IM=IM-1:VA=VA-1
- 640 KK$=CHR$(TT/256)+CHR$(TT-256*INT(TT/256))
- 650 MR$(QQ)=LEFT$(MR$(QQ),2*LM-2)+KK$+MID$(MR$(QQ),2*LM-1)
- 660 T1=FNE2(LN):A$(TT)=CHR$(LN-T1*256)+CHR$(T1)+IP$
- 670 IF NOT ERR THEN 730
- 680 FOR I=0 TO 6:IF LEN(MR$(I))<=250 THEN 710
- 690 MR$(I+1)=RIGHT$(MR$(I),2)+MR$(I+1)
- 700 MR$(I)=LEFT$(MR$(I),LEN(MR$(I))-2):IF PEEK(152)<>0 THEN T=FRE(0)
- 710 NEXT I:IM=IM+1
- 720 ERR=FALSE
- 730 RETURN
- 740 REM ***FIND LINE NUMBER IN FILE ARRAY***
- 750 TT=IM-VA:PW=FNF5(TT):MM=FNF6(PW):FOR BV=PW-1 TO 0 STEP -1
- 760 QQ=FNF1(MM):LM=FNF2(MM):MA=FNF3(QQ):T1=FNF4(MA):MM=FNF7(MM)
- 770 IF MM>TT-1 THEN MM=TT-1
- 780 NEXT BV
- 790 QQ=FNF1(MM):LM=FNF2(MM):MA=FNF3(QQ):T1=FNF4(MA):IF T1>=LN THEN 810
- 800 MM=MM+1:GOTO 790
- 810 ERR=NOT(T1=LN):RETURN
- 820 REM ***LIST LINES***
- 830 GOSUB 930:IF ERR THEN 910
- 840 GOTO 2820
- 850 PRINT"[147]":GOSUB 1040:IF FM<SM OR FM=0 THEN 910
- 860 IF DEV=4 THEN OPEN 2,DEV:CMD 2
- 870 FOR MM=SM TO FM:QQ=FNF1(MM):LM=FNF2(MM):MA=FNF3(QQ):GOSUB 1090:NEXT MM
- 880 IF DEV=4 THEN PRINT#2:CLOSE 2:GOSUB 1680
- 890 IF PEEK(152)=0 THEN PRINT"< RETURN FOR MAIN MENU >"
- 900 IF PEEK(152)=0 THEN GETT$:IF T$="" THEN 900
- 910 RETURN
- 920 REM ***INPUT LINE NUMBER RANGE***
- 930 PRINT"ENTER LINE NUMBER RANGE (EG 100-500)"
- 940 IP$="":INPUT"FIRST LINE-LAST LINE = ";IP$
- 950 SL=1:FL=65534:ERR=FALSE
- 960 IF LEN(IP$)=0 THEN 1020
- 970 GOSUB 500:IF LN>=0 THEN SL=LN:GOTO 990
- 980 IF LN>-1 THEN FL=-LN:GOTO 1020
- 990 GOSUB 550:IF LEN(IP$)=0 THEN FL=SL:GOTO 1020
- 1000 IP$=MID$(IP$,2):GOSUB 550
- 1010 IF LEN(IP$)>0 THEN GOSUB 500:FL=LN
- 1020 ERR=SL<1 OR SL>65534 OR FL<1 OR FL>65534 OR ERR:RETURN
- 1030 REM ***LINE NUMBER RANGE MARKERS***
- 1040 LN=SL:GOSUB 750:SM=MM
- 1050 LN=FL:GOSUB 750:FM=MM
- 1060 IF ERR THEN FM=FM-1
- 1070 RETURN
- 1080 REM ***LIST LINES MARKED BY MA***
- 1090 TP$=STR$(FNF4(MA)):PRINTMID$(TP$,2);" ";MID$(A$(MA),3)
- 1100 IF PEEK(152)=0 THEN WAIT 198,1,1:POKE 198,0
- 1110 RETURN
- 1120 REM ***DELETE LINE(S)***
- 1130 GOSUB 930:IF ERR THEN 1170
- 1140 GOTO 2820
- 1150 GOSUB 1040:IF FM<SM THEN 1170
- 1160 FOR MM=FMTOSM STEP -1:QQ=FNF1(MM):LM=FNF2(MM):MA=FNF3(QQ):GOSUB 1190:NEXTMM
- 1170 RETURN
- 1180 REM ***DELETE LINE MARKED BY MA***
- 1190 MR$(QQ)=LEFT$(MR$(QQ),2*LM-2)+MID$(MR$(QQ),2*LM+1)
- 1200 FOR I=0 TO 6
- 1210 IF LEN(MR$(I))>=250 OR LEN(MR$(I+1))=0 THEN 1230
- 1220 MR$(I)=MR$(I)+LEFT$(MR$(I+1),2):MR$(I+1)=MID$(MR$(I+1),3)
- 1230 NEXT I:VA=VA+1:A$(MA)=""
- 1240 IF LEN(EM$)>250 THEN 1260
- 1250 EM$=CHR$(MA/256)+CHR$(MA-256*INT(MA/256))+EM$
- 1260 RETURN
- 1270 REM ***MERGE FILE FROM DEVICE***
- 1280 GOSUB 1630:IF DEV=8 THEN TN$=TN$+",S,R"
- 1290 IF DEV<>1 AND DEV<>8 THEN RETURN
- 1300 GOTO 2820
- 1310 OPEN 2,DEV,0,TN$
- 1320 INPUT@2,IP$:GOSUB 500:IF LN=-1 OR ST THEN 1340
- 1330 GOSUB 550:GOSUB 580:GOTO 1320
- 1340 CLOSE 2:RETURN
- 1350 REM ***LOAD FILE FROM DEVICE***
- 1360 GOSUB 1630:IF DEV=8 THEN TN$=TN$+",S,R"
- 1370 IF DEV<>1 AND DEV<>8 THEN RETURN
- 1380 GOTO 2820
- 1390 OPEN 2,DEV,0,TN$
- 1400 INPUT@2,IP$:GOSUB 500:IF LN=-1 OR ST THEN 1460
- 1410 GOSUB 550:GOSUB 580
- 1420 INPUT@2,IP$:GOSUB 500:IF LN=-1 OR ST THEN 1460
- 1430 GOSUB 550:MM=MM+1:QQ=FNF1(MM):LM=FNF2(MM)
- 1440 IF LN<1 OR LN>65534 THEN 1420
- 1450 ERR=-1:GOSUB 600:GOTO 1420
- 1460 CLOSE 2:RETURN
- 1470 REM ***SAVE FILE TO DEVICE***
- 1480 GOSUB 1630:GOSUB 930:IF DEV<>1 AND DEV<>8 THEN 1610
- 1490 IF ERR THEN PRINT"INVALID LINES:RE-ENTER COMMANDS":GOTO 1480
- 1500 GOSUB 1040:ERR=(FL<SL):IF ERR THEN GOTO 1490
- 1510 IF DEV<>8 THEN 1580
- 1520 PRINT"ENTER FILE OPERATION :"
- 1530 INPUT"C[146]REATE,O[146]VERWRITE,A[146]PPEND (C/O/A) ";T$
- 1540 IF T$="C" THEN TN$=TN$+",S,W":GOTO 1580
- 1550 IF T$="O" THEN TN$="@0:"+TN$+",S,W":GOTO 1580
- 1560 IF T$="A" THEN TN$=TN$+",S,A":GOTO 1580
- 1570 GOTO 1510
- 1580 GOTO 2820
- 1590 OPEN 2,DEV,2,TN$:CMD 2:GOSUB 870
- 1600 PRINT#2:CLOSE 2
- 1610 RETURN
- 1620 REM ***INPUT FILE NAME***
- 1630 TN$="":GOSUB 1680:IF DEV=4 THEN 1660
- 1640 INPUT"FILE NAME = ";TN$:LT=LEN(TN$)
- 1650 IF LT>16 OR LT<1 THEN PRINT"FILE NAME INVALID":GOTO 1640
- 1660 RETURN
- 1670 REM ***CHANGE DEVICE NUMBER***
- 1680 PRINT"(PRINTER=4:DISC=8:TAPE=1)"
- 1690 PRINT SPC(21) DEV
- 1700 INPUT"[145]NEW DEVICE NUMBER = ";DEV:RETURN
- 1710 REM ***INITIALISE PROGRAM & DEFINE FUNCTIONS***
- 1720 DIM MR$(7),A$(300),FS(50):IM=2:VA=0
- 1730 MR$(0)=CHR$(0)+CHR$(0)+CHR$(0)+CHR$(1)
- 1740 A$(0)=CHR$(0)+CHR$(0):A$(1)=CHR$(255)+CHR$(255)
- 1750 CP$=""
- 1760 O$=" ":O$=O$+O$:RETURN
- 1770 DEF FNF1(MM)=INT((MM-1)/125):DEF FNF2(MM)=MM-125*QQ
- 1780 DEF FNF3(QQ)=256*ASC(MID$(MR$(QQ),2*LM-1))+ASC(MID$(MR$(QQ),2*LM))
- 1790 DEF FNF4(MA)=ASC(MID$(A$(MA),1,1))+256*ASC(MID$(A$(MA),2,1))
- 1800 DEF FNF5(TT)=INT(LOG(TT)/.693147)
- 1810 DEF FNF6(PW)=2^PW:DEF FNF7(MM)=MM+2^BV*((LN<T1)-(LN>T1))
- 1820 DEF FNF8(P)=1024+LR*40+P:DEF FNE1(TT)=256*ASC(EM$)+ASC(MID$(EM$,2))
- 1830 DEF FNE2(LN)=INT(LN/256):RETURN
- 1840 REM ***EDIT FILE***
- 1850 P=0:LR=1:LP=1:AI=0:TF=0:NS=11:TP$="":FQ=0:IF TH=1 THEN TH=0:GOTO 1930
- 1860 IF TC=1 THEN TC=0:GOTO 1930
- 1870 INPUT"EDIT FROM LINENUMBER = ";LN:LT=LN
- 1880 GOSUB 750:IF ERR AND TF=0 OR LN<1 OR LN>65534 THEN 1900
- 1890 GOTO 1930
- 1900 INPUT"INVALID LINE:R[146]E-ENTER OR E[146]XIT";T$
- 1910 IF T$="E" THEN RETURN
- 1920 GOTO 1870
- 1930 IF NS>IM-MM-VA THEN NS=IM-MM-VA
- 1940 IF NS=0 AND (IM-VA)>2 THEN 2420
- 1950 IF NS=0 THEN RETURN
- 1960 PT=MM:QQ=FNF1(MM):LM=FNF2(MM):MA=FNF3(QQ):LT=VAL(STR$(FNF4(MA))):PRINT"[147]"
- 1970 FOR PR=1 TO NS
- 1980 QQ=FNF1(MM):LM=FNF2(MM):MA=FNF3(QQ)
- 1990 TP$=STR$(FNF4(MA))
- 2000 TP$=MID$(TP$,2)+" "+MID$(A$(MA),3)
- 2010 CD$=LEFT$(CP$,LR-(2*INT(LR/2)-LR<>0)-1)
- 2020 PRINT"";CD$;O$;"[145][145]";TP$
- 2030 MM=MM+1:LR=LR+2:NEXT PR
- 2040 LR=LP+2*(LP=NS*2+1)
- 2050 AC=AI:AI=PT+INT((LR+1)/2)-1:IF AI=AC AND TF=0 THEN 2090
- 2060 QQ=INT((AI-1)/125):LM=AI-125*QQ:TF=0
- 2070 MA=FNF3(QQ):TP$=STR$(FNF4(MA))
- 2080 TP$=MID$(TP$,2)+" "+MID$(A$(MA),3)
- 2090 CD$=LEFT$(CP$,LR-(2*INT(LR/2)-LR<>0)-1)
- 2100 PRINT"";CD$;O$;"[145][145]";TP$
- 2110 CH=PEEK(FNF8(P)):POKE 54272+FNF8(P),14:POKE FNF8(P),160
- 2120 FOR NU=1 TO 5:NEXT NU:POKE FNF8(P),CH
- 2130 GET SC$:IF SC$="" THEN 2110
- 2140 IF SC$=CHR$(34) THEN FQ=-(FQ=0)
- 2150 IF SC$=CHR$(13) THEN 2440
- 2160 IF SC$=CHR$(141) THEN RETURN
- 2170 IF SC$=CHR$(19) AND FQ=0 THEN RETURN
- 2180 IF SC$=CHR$(147) AND FQ=0 THEN RETURN
- 2190 IF SC$=CHR$(133) THEN 2400
- 2200 IF SC$=CHR$(137) THEN 2420
- 2210 IF SC$=CHR$(134) THEN P=0:LR=1:GOTO 2050
- 2220 IF SC$=CHR$(138) THEN P=0:LR=NS*2-1:GOTO 2050
- 2230 IF SC$=CHR$(135) THEN P=0:GOTO 2110
- 2240 IF SC$=CHR$(139) THEN P=LEN(TP$)-1:GOTO 2110
- 2250 IF SC$=CHR$(136) THEN RETURN
- 2260 IF SC$=CHR$(140) THEN PRINT"[147]":GOTO 1850
- 2270 IF P>0 AND SC$=CHR$(20) THEN TP$=LEFT$(TP$,P-1)+MID$(TP$,P+1):P=P-1
- 2280 IF SC$=CHR$(20) THEN 2050
- 2290 IF SC$="[145]" AND P<=39 AND FQ=0 THEN LR=LR+2*(LR>1):P=0:GOTO 2050
- 2300 IF SC$="[145]" AND P>39 AND FQ=0 THEN P=P-40:GOTO 2110
- 2310 IF SC$="" AND P<=39 AND LEN(TP$)>40 AND FQ=0 THEN P=40:GOTO 2110
- 2320 IF SC$="" AND FQ=0 THEN LR=LR-2*(LR<NS*2-1):P=0:GOTO 2050
- 2330 IF LEN(TP$)=80 THEN 2370
- 2340 IF SC$=CHR$(148) THEN TP$=LEFT$(TP$,P)+" "+MID$(TP$,P+1):GOTO 2050
- 2350 IF FQ=1 THEN TP$=LEFT$(TP$,P)+SC$+MID$(TP$,P+2):P=P-1*(P<79):GOTO 2050
- 2360 IFSC$<>"[157]"ANDSC$<>""THENTP$=LEFT$(TP$,P)+SC$+MID$(TP$,P+2):P=P-1*(P<79):GOTO2050
- 2370 IF SC$="[157]" AND P>0 THEN P=P-1
- 2380 IF SC$="" AND P<LEN(TP$)-1 THEN P=P+1
- 2390 GOTO 2110
- 2400 MM=PT+11:IF MM>IM-VA THEN MM=IM-VA-1
- 2410 TH=1:GOTO 1850
- 2420 MM=PT-11:IF MM<2 THEN MM=2
- 2430 TC=1:GOTO 1850
- 2440 IP$=LEFT$(TP$,LEN(TP$))
- 2450 GOSUB 500:IF LN<1 OR LN>65534 OR LN=-1 THEN 2490
- 2460 GOSUB 550:IF LEN(IP$)=0 THEN 2480
- 2470 GOSUB 580:GOTO 2490
- 2480 GOSUB 750:IF NOT ERR THEN GOSUB 1190
- 2490 TF=1:P=0:LP=LR:LN=LT:LR=1:NS=11:FQ=0:GOTO 1880
- 2500 REM ***SEARCH ROUTINE***
- 2510 INPUT"INPUT SEARCH STRING = ";TG$:GOSUB 930:IF ERR THEN RETURN
- 2520 GOSUB 1040:IF FM<SM OR FM=0 THEN RETURN
- 2530 GOTO 2820
- 2540 PRINT"[147]LINES FOUND= LINES SCANNED="
- 2550 K=0:FOR MM=SM TO FM:QQ=FNF1(MM):LM=FNF2(MM):MA=FNF3(QQ)
- 2560 FOR I=1 TO LEN(A$(MA))-LEN(TG$)+1
- 2570 IF MID$(A$(MA),I,LEN(TG$))=TG$ THEN K=K+1:FS(K)=MA:GOTO 2590
- 2580 NEXT I
- 2590 IF K>49 THEN PRINT"SEARCH TERMINATING-ARRAY FS(K) FULL":GOTO 2620
- 2600 PRINT"";K;"";MM-SM+1:NEXT MM:PRINT
- 2610 REM ***LIST SEARCH LINES***
- 2620 IF K=0 THEN 2660
- 2630 FOR I=1TOK:MA=FS(I):TP$=STR$(FNF4(MA)):PRINTMID$(TP$,2);" ";MID$(A$(MA),3)
- 2640 IF PEEK(152)=0 THEN WAIT 198,1,1:POKE 198,0
- 2650 NEXT I
- 2660 GOTO 890
- 2670 REM ***LIST DIRECTORY***
- 2680 PRINT"[147]":OPEN 1,8,0,"$0":GET#1,B$,D$
- 2690 GET#1,B$,D$:GET#1,B$,D$:B=0
- 2700 IF B$<>"" THEN B=ASC(B$)
- 2710 IF D$<>"" THEN B=B+ASC(D$)*256
- 2720 PRINT""MID$(STR$(B),2);TAB(5);"[146]";
- 2730 GET#1,D$:IF ST<>0 THEN 2810
- 2740 IF D$<>CHR$(34) THEN 2730
- 2750 GET#1,D$:IF D$ <>CHR$(34) THEN PRINTD$;:GOTO 2750
- 2760 GET#1,D$:IF D$=CHR$(32) THEN 2760
- 2770 PRINT TAB(18);:C$=""
- 2780 C$=C$+D$:GET#1,D$:IF D$<>"" THEN 2780
- 2790 PRINTTAB(22)""LEFT$(C$,3)
- 2800 IF ST=0 THEN 2690
- 2810 PRINT"BLOCKS FREE":CLOSE 1:GOTO 890
- 2820 REM ***CONFIRMATION ROUTINE***
- 2830 INPUT"IS ABOVE CORRECT (Y/N) Y[157][157][157]";T$
- 2840 IFT$="Y"THEN ONCMGOTO 2870,2870,1390,2870,850,1150,2870,1310,1590,2870,2540
- 2850 IFT$="N"THEN ONCMGOTO 70,70,2880,2880,2880,2880,2880,2880,2880,2880,2880
- 2860 GOTO 2830
- 2870 CLR:END
- 2880 RETURN
- 2890 REM ***INPUT@ ROUTINE***
- 2900 AD=49152:LN=2960
- 2910 READ VL:IF VL<256 THEN POKE AD,VL:SU=SU+VL:AD=AD+1:GOTO 2910
- 2920 IF SU=VL THEN SU=0:LN=LN+10:GOTO 2910
- 2930 IF VL=999 THEN 2950
- 2940 PRINT"[147]DATA ERROR IN LINE";LN:STOP
- 2950 SYS 49152:RETURN
- 2960 DATA 169,11,160,192,141,8,3,140,824
- 2970 DATA 9,3,96,32,115,0,201,133,589
- 2980 DATA 240,6,32,121,0,76,231,167,873
- 2990 DATA 32,115,0,201,64,240,6,32,690
- 3000 DATA 191,171,76,174,167,32,155,183,1149
- 3010 DATA 32,30,225,32,253,174,160,0,906
- 3020 DATA 32,183,255,41,100,208,20,132,971
- 3030 DATA 252,32,18,225,164,252,153,160,1256
- 3040 DATA 192,200,201,13,208,234,136,192,1376
- 3050 DATA 0,240,227,132,251,32,139,176,1197
- 3060 DATA 133,73,132,74,32,163,182,165,954
- 3070 DATA 251,32,117,180,160,2,185,97,1024
- 3080 DATA 0,145,73,136,16,248,164,251,1033
- 3090 DATA 192,0,240,9,136,185,160,192,1114
- 3100 DATA 145,98,136,16,248,32,204,255,1134
- 3110 DATA 76,174,167,417,999
-